#include <stdio.h>

int main()
{
#if 0
    //字符串：多个连续字符的组合
    //"helloworld"
    //文字常量区：存放常量（存放最多的是常量字符串）
    //常量区数据不可修改
    //char s[10] = 
    const char *s = "helloworld";   //常量字符串指针（用const限制，这样后面如果修改值编译期就会报错）//相当于把helloworld的首地址给到s
    //以字符串形式输出 给的是字符串的首地址
    printf("%s", s);            //输出字符串
    printf("%c\n", *s);         //输出第一个字符
    printf("%c\n", *( s + 1));  //输出第二个字符
    *s = 'p';   //常量区 不可修改值（能编过，但会发生段错误）
#endif

#if 0
    //初始化
    //字符数组可以存放字符串
    //char s[10] = {'h', 'e', 'l', 'l', 'o'}; //赋字符
    char s[10] = "hello";   //直接赋字符串（由于hello在常量区，s在栈上，所以赋字符串时其实是内存的拷贝）
    //char s[] = "hello";   //这样赋值也可以（给它分配刚好的大小）
    //s = "world";  //把world常量区的首地址给s（这里不可以这么写，数组在栈上，s是数组的首地址，它一定只能表示栈上的数组首地址，不能更改它的朝向，能够取内存，取的只有这个数组的内存，如果s是指针，则可以这样写）
    *s = p; //拷贝后在栈内，这就可以修改值
    printf("%s\n", s)
#endif

/*
    常量字符串指针 const char *s
    字符数组首地址 char s[10]

    1.字符数组可以改内存值
    2.字符串指针可以改朝向
*/

#if 1
    //字符串结尾有一个结束符（'\0'）因为内存里存的都是整型值，计算机不知道字符串到什么时候结束，所以规定一个字符串以数字0结尾，而数字0的值换算成assic码值就是'\0'
    char s[] = "ABCDE";
    //s = "world";
    for(int i = 0; i < sizeof(s); i++)
    {
        printf("%c\n", s[i]);
    }
#endif

    return 0;
}